from pymongo import MongoClient


class MongoDB:
    def __init__(self, host='localhost', port=27017, username=None, password=None, auth_db='admin'):
        self.host = host
        self.port = port
        self.username = username
        self.password = password
        self.auth_db = auth_db

    def connect(self):
        """建立数据库连接"""
        uri =  f'mongodb://{self.host}:{self.port}/'
        if self.username and self.password:
            uri = f'mongodb://{self.username}:{self.password}@{self.host}:{self.port}/?authSource={self.auth_db}'
        #这个是一个类，创建一个类的对象/连接数据库的对象，uri是类的初始化的值，就是连接数据库
        self.client = MongoClient(uri) # 保存到全局，方便下面跨函数使用同一个连接的mongo

    def close(self):
        """关闭数据库连接"""
        # 判断是否存在（）
        if self.client:
            #对象调用方法/函数
            self.client.close()

    def insert(self, db_name, collection_name, data):
        """插入单条或多条数据"""
        db = self.client[db_name] #数据库——拿对象的属性就是字典拿值——对象的属性就是字典格式
        collection = db[collection_name] #集合
        # 判断data是否为数组, 数组就是多条数据
        if type(data) == list:
            # 通过将列表作为第一个参数传递给 insert_many（）。
            result = collection.insert_many(data)
        else:
            # 要将文档插入到集合中，我们可以使用 insert_one（） 方法
            result = collection.insert_one(data)
        return result

    def query(self, db_name, collection_name, filter=None, projection=None, limit=0):
        """查询数据"""
        db = self.client[db_name]
        collection = db[collection_name]
        cursor = collection.find(filter, projection).limit(limit)
        cursor.limit(limit)
        return list(cursor)


if __name__ == '__main__':
    # 实例化mongodb
    my = MongoDB("192.168.88.105", 27017, "admin1", "123456", auth_db='admin')
    # 连接 mongodb
    my.connect()
    # 准备插入的数据
    doc = {"title": "John", "price": 30, "weiht": 100}
    # 进行数据插入
    doc_result = my.insert("itheima", "good", doc)
    print(f"插入文档返回结果: {doc_result}")

    # 查询数据
    results = my.query("itheima", "good", limit=5)
    for result in results:
        print(result)

    print("------------------------")
    # 准备插入的数据
    doc = [
        # {"title": "John", "price": 30, "weiht": 100},
        {"title": "North", "price": 3000000, "weiht": 100},
        {"title": "North1", "price": 3000000, "weiht": 100},
    ]
    # 进行数据插入
    doc_result = my.insert("itheima", "good", doc)
    print(f"插入文档返回结果: {doc_result}")

    results = my.query("itheima", "good")
    for result in results:
        print("result", result)

    print("-0--------------------------------------00000")
    my.close()
    print(my.host)
    print(my.port)